package net.club.services.gestion.usuario;

import beans.club.services.AbstractBeanInput;
import beans.club.services.AbstractBeanOutput;
import beans.club.services.usuario.ABMCUsuarioInput;
import beans.club.services.usuario.ABMCUsuarioOutput;

import net.club.beans.ActividadFija;
import net.club.beans.EstadoUsuario;
import net.club.beans.TipoDocumento;
import net.club.beans.Usuario;

import net.club.services.AbstractService;
import net.club.services.constants.ICONSTANTES_ERRORS;

import java.util.Iterator;
import java.util.List;


public class UsuarioServiceImpl extends AbstractService
    implements IUsuarioService {
    /**
         *
         */
    private static final long serialVersionUID = -2478201362314173594L;

    public UsuarioServiceImpl() {
    }

    public ABMCUsuarioOutput alta(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCUsuarioInput input = (ABMCUsuarioInput) inputAbs;
        ABMCUsuarioOutput output = new ABMCUsuarioOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        Usuario usuario = (Usuario) getEntity(input.getUsuario().getUriEntidad(),
                Usuario.class);

        if (daoUsuario.create(usuario)) {
            result = true;
        }

        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    private boolean validateABMCBean(ABMCUsuarioInput input,
        List<String> errores) {
        if (input.getUsuario() == null) {
            errores.add(ICONSTANTES_ERRORS.BEAN_USR_NULO);

            return false;
        }

        return true;
    }

    @Override
    public AbstractBeanOutput baja(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCUsuarioInput input = (ABMCUsuarioInput) inputAbs;
        ABMCUsuarioOutput output = new ABMCUsuarioOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        Usuario usuario = (Usuario) getEntity(input.getUsuario().getUriEntidad(),
                Usuario.class);

        if (usuario != null) {
            List<EstadoUsuario> estados = daoEstadoUsuario.findAll();

            for (Iterator<EstadoUsuario> it = estados.iterator(); it.hasNext();) {
                EstadoUsuario estado = it.next();

                if (estado.getNombre().equals("BAJA")) {
                    usuario.setEstadoUsuario(estado);

                    if (daoUsuario.update(usuario)) {
                        result = true;
                    }

                    result = true;

                    break;
                }
            }
        }

        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    @Override
    public AbstractBeanOutput modificacion(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCUsuarioInput input = (ABMCUsuarioInput) inputAbs;
        ABMCUsuarioOutput output = new ABMCUsuarioOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        Usuario usuario = (Usuario) getEntity(input.getUsuario().getUriEntidad(),
                Usuario.class);

        if (usuario != null) {
            //TODO bindear con dozer
            if (daoUsuario.update(usuario)) {
                result = true;
            }

            result = true;
        }

        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    public List<Usuario> getUsuarios() {
        return daoUsuario.findAll();
    }

    public boolean altaActividadFija(ActividadFija actividad) {
        return daoActividadFija.create(actividad);
    }

    public boolean altaEstadoUsuario(EstadoUsuario estado) {
        return daoEstadoUsuario.create(estado);
    }

    public List<EstadoUsuario> getEstados() {
        return daoEstadoUsuario.findAll();
    }

    public boolean altaTipoDocumento(TipoDocumento tipo) {
        return daoTipoDocumento.create(tipo);
    }

    public List<TipoDocumento> getTiposDocumentos() {
        return daoTipoDocumento.findAll();
    }

    public List<ActividadFija> getActividadFijas() {
        return daoActividadFija.findAll();
    }

    public boolean modificacion(Usuario usuario, List<String> errores) {
        return daoUsuario.update(usuario);
    }

    @Override
    protected ABMCUsuarioOutput consulta(AbstractBeanInput inputAbs,
        List<String> errores) {
        boolean result = false;
        ABMCUsuarioInput input = (ABMCUsuarioInput) inputAbs;
        ABMCUsuarioOutput output = new ABMCUsuarioOutput();

        if (!validateABMCBean(input, errores)) {
            result = false;
        }

        //TODO con detachedCriteria realizar los filtros.
        super.consulta(input, errores);
        output.setErrores(errores);
        output.setResponse(result);

        return output;
    }

    public AbstractBeanOutput process(AbstractBeanInput input) {
        return super.doProcess(input);
    }
}
